package com.intretech.umsin.datasource.dao;

import com.baomidou.mybatisplus.core.metadata.IPage;

import java.util.List;
import java.util.Map;

/**
 * @version V1.0
 * @InterfaceName: KernDAO
 * @Description: 对应提供的服务接口
 * @author: 李启联
 * @date: 2022-6-22 14:55
 * @Copyright: Copyright (c) 2022
 */
public interface KernDAO {


    /**
     * 分页的形式返回SQL查询结果
     *
     * @param sql      查询的SQL语句 ;SQL语句形式：(select * from T where Id=? and Name=? 或者 select * from T where Id='1' and Name='A') <br/>
     *                 示例：select CONCAT(T.col_1) as c1,T.col_2 from T
     * @param args     查询可变参数
     * @return 得到数据集合列表
     * @throws Exception
     */
    List<Map<String, Object>> queryForListMap(String sql, Object... args);

    /**
     * 通过sql查询，并把结果集填充到对应类型的实体对象集合中。<BR/>
     * 填充规则：[实体属性名称与结果集字段 	  1.不分大小写  2.驼峰格式相互可以转成 相对应],找到便填充。
     * @param sql 查询的SQL语句 ;SQL语句形式：(select * from T where Id=? and Name=? 或者 select * from T where Id='1' and Name='A') <br/>
     * @param type 实体对象的类型（如：T.class）
     * @param args 查询可变参数
     * @return 实体对象集合
     * @throws Exception
     */
    <T> List<T> queryForList(String sql,Class<T> type, Object... args);


    /**
     * 通过SQL查询语句、存储过程、本地sql模板文件得到第一条查询结果数据,数据以Map形式返回
     * @param sql SQL语句,SQL语句形式：(select * from T where Id=? and Name=?)
     * @param args 执行sql命令或存储过程时传入的可变参数
     * @return 第一条查询结果数据,数据以Map形式返回
     * @throws Exception
     */
    Map<String,Object> queryForMap(String sql, Object... args);

    /**
     * 通过sql查询，并把结果集填充到对应类型的实体对象中。<BR/>
     * 填充规则：[实体属性名称与结果集字段 	  1.不分大小写  2.驼峰格式相互可以转成 相对应],找到便填充。
     * @param sql 查询的SQL语句 ;SQL语句形式：(select * from T where Id=? and Name=? 或者 select * from T where Id='1' and Name='A') <br/>
     * @param type 实体对象的类型（如：T.class）
     * @param args 查询可变参数
     * @return 单个实体对象
     * @throws Exception
     */
    <T> T queryForObject(String sql,Class<T> type, Object... args);

    /**
     * 执行指定数据库连接字符串的命令,返回结果集中的第一行第一列.
     * @param sql SQL语句,SQL语句形式：(select * from T where Id=? and Name=?)
     * @param args 查询可变参数
     * @return 结果集中的第一行第一列的值
     * @throws Exception
     */
    Object queryForScalar(String sql, Object... args);

    /**
     * 分页的形式返回SQL查询结果
     *
     * @param page 分页对象
     * @param sql  查询语句 SQL语句形式：(select * from T where Id=? and Name=?)
     * @param type 实体对象的类型（如：T.class）
     * @param args 查询可变参数
     * @return
     * @throws Exception
     */
    <T> IPage<T> queryForPage(IPage page, String sql, Class<T> type, Object... args);

    /**
     * 通过预编译的SQL查询语句（防SQL注入）或存储过程执行 INSERT、UPDATE 或 DELETE 语句以及 SQL
     * DDL（数据定义语言）语句。
     *
     * @param sql SQL语句,SQL语句形式：(insert into T(C1,C2,C3) values(?,?,?))
     * @param args 可变参数
     * @return 返回执行sql操作所影响的行数 【定义 -1 为操作失败】
     * @throws Exception
     */
    int excuteNonQuery(String sql, Object... args);

}
